package org.easyframework.redis.config;

import org.redisson.Redisson;
import org.redisson.config.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ClassName: RedissonConfig
 * @Description: Redisson配置类
 * @author: daiw
 * @date: 2019年10月15日 下午3:00:56
 */
@Configuration
public class RedissonConfig {
	private static final Logger logger = LoggerFactory.getLogger(RedissonConfig.class);
	@Value("${spring.redis.cluster.nodes}")
	private String clusterNodes;
	@Value("${redis.mode}")
	private Integer redisModel;

	private Redisson redisson;

	private Config config = new Config();

	/**
	 * 初始化Redisson 集群模式
	 */
	@Bean
	public Redisson getRedisson() {
		if (redisModel == null || redisModel.intValue() != 2) {
			return null;
		}
		String[] nodes = clusterNodes.split(",");
		try {
			config.useClusterServers()//
					.setScanInterval(2000)// 设置集群状态扫描时间
					.setMasterConnectionPoolSize(10000)// 设置连接数
					.setSlaveConnectionPoolSize(10000)// 同任何节点建立连接时的等待超时。时间单位是毫秒。默认：10000
					.addNodeAddress(nodes[0], nodes[1], nodes[2], nodes[3], nodes[4])// 节点，RedLock取大于等于3的单数个节点（与redlock算法有关）
					.setConnectTimeout(30000)// 当与某个节点的连接断开时，等待与其重新建立连接的时间间隔。时间单位是毫秒。默认:3000
					.setReconnectionTimeout(10000)// 等待节点回复命令的时间。该时间从命令发送成功时开始计时。默认:3000
					.setTimeout(10000)// 如果尝试达到 retryAttempts（命令失败重试次数）
					// 仍然不能将命令发送至某个指定的节点时，将抛出错误。如果尝试在此限制之内发送成功，则开始启用
					// timeout（命令等待超时） 计时。默认值：3
					.setRetryAttempts(5)// 在一条命令发送失败以后，等待重试发送的时间间隔。时间单位是毫秒。
					// 默认值：1500
					.setMasterConnectionMinimumIdleSize(3)//
					.setMasterConnectionPoolSize(6)//
					.setSlaveConnectionMinimumIdleSize(3)//
					.setSlaveConnectionPoolSize(6)//
					.setRetryInterval(3000);//
			config.setNettyThreads(6);
			redisson = (Redisson) Redisson.create(config);
		} catch (Exception e) {
			e.printStackTrace();
		}
		logger.info("初始化Redisson成功!");
		return redisson;
	}

}
